package com.fdb.efp.nls.service.impl.bd;

import com.baidu.unionloan.common.util.Security;
import com.fdb.basic.framework.core.base.FrameworkService;
import com.fdb.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.fdb.basic.framework.core.util.*;
import com.fdb.efp.nls.service.facade.BdAccFileAnalysisService;
import com.fdb.efp.nls.service.util.BaiduFileCyptUtil;
import com.fdb.efp.esb.common.constant.MsLoanConstant;
import com.fdb.efp.nls.service.facade.AccoutErroTempService;
import com.fdb.efp.nls.service.vo.AccoutErroTempVO;
import com.fdb.efp.nls.common.constant.PrdInfoEnum;
import com.fdb.efp.nls.service.facade.NlsApplyInfoService;
import com.fdb.efp.nls.service.vo.NlsApplyInfoVO;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
import org.apache.commons.vfs.FileSystemException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
import java.util.Vector;

/**
 * 
 * 交互文件服务-百度同步文件解析
 * 
 * @author ludayong
 * @since 2019年4月12日 上午11:43:34
 * @version 1.0
 */
@Service("bdAccFileAnalysisService")
public class BdAccFileAnalysisServiceImpl implements BdAccFileAnalysisService, FrameworkService {

	private static Logger logger = LoggerFactory.getLogger(BdAccFileAnalysisServiceImpl.class);

	@Value("${analysis.accFilePathBaidu}")
	private String accFilePathBaidu;// 同步文件解析路径

	@Value("${file.remoteDownAccfilePathBaidu}")
	private String remoteDownAccfilePathBaidu;// 前置文件服务器：下载地址

	@Value("${analysis.hjFtpHost}")
	private String hjFtpHost;// 前置文件服务器IP地址

	@Value("${analysis.hjUserName}")
	private String hjUserName;// 前置文件服务器用户名

	@Value("${analysis.hjPassword}")
	private String hjPassword;// 前置文件服务器登录密码

	@Value("${analysis.hjFtpPort}")
	private int hjFtpPort;// 前置文件服务器端口号

	@Value("${baiduFile.tarGz}")
	private String tarGz;// .tar.gz 文件后缀名

	@Value("${baiduFile.md5}")
	private String md5;// md5 文件后缀名

	// 满易贷 0050
	@Value("${baiduFile.scrtFlag0050}")
	private String scrtFlag0050;

	// 尊享贷 0051
	@Value("${baiduFile.scrtFlag0051}")
	private String scrtFlag0051;

	// 满易贷 0050
	@Value("${baiduFile.scrtFlag0170}")
	private String scrtFlag0170;

	// 尊享贷 0051
	@Value("${baiduFile.scrtFlag0171}")
	private String scrtFlag0171;

	// 机构码 满易贷 0050
	@Value("${baiduFile.institutionCode}")
	private String institutionCode0050;

	// 机构码 尊享贷 0051
	@Value("${baiduFile.institutionCode2}")
	private String institutionCode0051;

	// 机构码 满易贷 0170
	@Value("${baiduFile.institutionCode0170}")
	private String institutionCode0170;

	// 机构码 尊享贷 0171
	@Value("${baiduFile.institutionCode0171}")
	private String institutionCode0171;

	// 账务文件下载地址
	@Value("${baiduFile.baiduAccFileDownPath}")
	private String baiduAccFileDownPath;

	// 并账文件下载地址
	@Value("${baiduFile.baiduAccLedgerFileDownPath}")
	private String baiduAccLedgerFileDownPath;

	// 合同文件下载地址
	@Value("${baiduFile.baiduAgreementFileDownPath}")
	private String baiduAgreementFileDownPath;

	// 资金划拨扩展文件下载地址
	@Value("${baiduFile.baiduTransFerMoneyFileDownPath}")
	private String baiduTransFerMoneyFileDownPath;

	// 账务文件下载文件名称
	@Value("${baiduFile.baiduAccFileName}")
	private String baiduAccFileName;

	// 并账文件下载文件名称
	@Value("${baiduFile.baiduAccLedgerFileName}")
	private String baiduAccLedgerFileName;

	// 并账文件名称
	@Value("${baiduFile.baiduLedgerFileName}")
	private String baiduLedgerFileName;

	// 合同文件下载文件名称
	@Value("${baiduFile.baiduAgreementFileName}")
	private String baiduAgreementFileName;

	// 资金划拨扩展文件下载文件名称
	@Value("${baiduFile.baiduTransFerMoneyFileName}")
	private String baiduTransFerMoneyFileName;

	// 账务文件后缀名
	@Value("${baiduFile.baiduFileSuffix}")
	private String baiduFileSuffix;

	// 影像文件后缀名
	@Value("${baiduFile.baiduImageFileSuffix}")
	private String baiduImageFileSuffix;

	// 账务文件解密文件后缀名
	@Value("${baiduFile.baiduAccFileSuffix}")
	private String baiduAccFileSuffix;

	// 百度借款协议下载路径
	@Value("${analysis.baidu.imageFileDownPath}")
	private String imageFileDownPath;

	// 百度借款协议备份路径
	@Value("${analysis.baidu.imageFileBakPath}")
	private String imageFileBakPath;

	// 对方公钥
	@Value("${baiduFile.getPublicKeyPartner}")
	private String getPublicKeyPartner;

	// 我方私钥
	@Value("${baiduFile.getPrivateKeyLocal}")
	private String getPrivateKeyLocal;

	// 同步文件记录异常信息
	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;

	// 试单业务
	private static final String TYPE_LE = "LE";

	// 正式业务
	private static final String TYPE_LF = "LF";

	// 文件类型：账务文件
	private static final String ACC_FILE = "AccFile";

	// 文件类型：并账文件
	private static final String ACC_LEDGER = "AccLedger";

	// 文件类型：合同文件
	private static final String AGREEMENT = "Agreement";

	// 文件类型：资金划拨扩展文件
	private static final String TRANS_FER_MONEY = "TransFerMoney";

	// 解密存放文件夹
	@Value("${baiduFile.baiduJm}")
	private String baiduJm;

	// 解压文件夹
	@Value("${baiduFile.baiduJy}")
	private String baiduJy;

	@Autowired
	@Qualifier("nlsApplyInfoService")
	private NlsApplyInfoService nlsApplyInfoService;// 网贷申请信息

	/**
	 * 
	 * 交互文件服务-对账文件解析
	 * 
	 * @return boolean
	 * @throws Exception
	 * @author ludayong
	 * @since 2019年1月9日 上午9:09:16
	 * @version 1.0
	 */
	@Override
	public boolean analysisFile() throws Exception {
		boolean fileDownRes = downloadFile();// 前置文件服务器下载文件
		boolean result = false;
		// 1、解压同步文件
		logger.info("1、解压百度同步文件，同步文件解析路径accFilePath" + accFilePathBaidu);
		File files = new File(accFilePathBaidu);// 解析文件
		if (fileDownRes && files.exists()) {
			File[] accFiles = files.listFiles();
			if (accFiles.length > 0) {
				for (File accFile : accFiles) {
					if (accFile.getName().endsWith(tarGz)) {// 同步文件
						// MD5校验文件路径
						String md5FilePath = accFile.getAbsolutePath().replace(tarGz, md5);
						File md5File = new File(md5FilePath);
						if (!md5File.exists()) {
							logger.error("tar包和MD5文件需在同一个文件夹下");
							throw new Exception("tar包和MD5文件需在同一个文件夹下");
						}
						try {
							// 1、解压同步文件
							logger.info("校验md5文件存在,解压同步文件开始");
							// 百度对账文件解压
							String unTarPath = accFile.getAbsolutePath().replace(tarGz, "");
							File unTarFile = new File(unTarPath);
							if (!unTarFile.exists()) {
								unTarFile.mkdir();
							}
							Security.doUnTarGZip(accFile.getParent(), unTarPath, accFile.getName());
							result = true;
							logger.info("校验md5文件存在,解压同步文件结束" + result);
						} catch (Exception e) {
							logger.error("交互文件服务-对账文件解压出现异常，异常信息" + e.getMessage());
							e.printStackTrace();
							throw new IOException();
						}
					}
				}
			}

		}
		return result;
	}

	/**
	 * 从前置文件服务器下载文件
	 * 
	 * @return
	 * @throws Exception
	 * @author ludayong
	 * @since 2019年1月15日 上午8:54:23
	 * @version 1.0
	 */
	private boolean downloadFile() throws Exception {
		// 连接前置文件服务器
		SFTPUtil sftpUtil = null;
		boolean fileDownRes = false;// 下载文件是否成功
		int downTotal = 0;
		try {
			// 从前置文件服务器下载文件到本地
			logger.info("从前置文件服务器信息：" + hjUserName + " / " + hjPassword + " IP: " + hjFtpHost + " 端口号：" + hjFtpPort);
			logger.info("从前置文件服务器下载文件到本地");
			sftpUtil = new SFTPUtil(hjUserName, hjPassword, hjFtpHost, hjFtpPort);
			// 检测解析目录是否有需要解析的文件存在
			logger.info("检测解析目录是否有需要解析的文件存在，remoteDownAccfilePath前置文件服务器：下载地址" + remoteDownAccfilePathBaidu);
			Vector<ChannelSftp.LsEntry> files = sftpUtil.ls(remoteDownAccfilePathBaidu);
			Objects.requireNonNull(files);// 文件不允许为空

			for (ChannelSftp.LsEntry file : files) {
				String fileName = file.getFilename();// 下载文件名
				logger.info("下载文件名" + file.getFilename());
				if (".".equals(fileName) || "..".equals(fileName)) {
					continue;
				} else {
					try {
						boolean singleFileDownRes = sftpUtil.downFile(sftpUtil, remoteDownAccfilePathBaidu, file.getFilename(),
								accFilePathBaidu, file.getFilename(), false);
						logger.info("前置文件服务器下载文件：" + remoteDownAccfilePathBaidu + file.getFilename() + "，结果[" + singleFileDownRes + "]");
						if (singleFileDownRes) {
							downTotal++;// 下载文件数
						}
					} catch (Exception e) {
						e.printStackTrace();
						logger.error("前置文件服务器下载文件出现异常：" + e.getMessage());
					}
				}
			}
			if (downTotal > 0) {// 下载文件数大于0，则解析
				fileDownRes = true;
			}
			logger.info("本次前置文件服务器下载文件数目：[" + downTotal + "]");
		} catch (FileSystemException e) {
			logger.error("前置文件服务器下载文件出现异常：" + e.getMessage());
			e.printStackTrace();
		} catch (JSchException e) {
			logger.error("前置文件服务器下载文件出现异常：" + e.getMessage());
			e.printStackTrace();
		} catch (Exception e) {
			logger.error("前置文件服务器下载文件出现异常：" + e.getMessage());
			e.printStackTrace();
		} finally {
			if (sftpUtil != null) {
				sftpUtil.closeSFTP();
			}
		}
		return fileDownRes;
	}

	/**
	 * 
	 * 从百度服务器下载百度账务文件下载 <br>
	 * 0.1:ludayong:2019年7月15日 上午10:48:33:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年7月15日 上午10:48:33
	 * @date 2019年7月15日 上午10:48:33
	 * @version 0.1
	 */
	@Override
	public boolean downAccFile(String curDate, String prdCode, String fileType, String type) throws Exception {
		boolean result = false;
		// 校验百度账务文件下載入参信息是否正确
		if (!checkParamInfo(curDate, prdCode, fileType, type)) {
			return result;
		}

		String filePath = accFilePathBaidu + prdCode + File.separator + curDate;
		// 创建目录
		File dir = new File(filePath);
		if (!dir.exists()) {
			dir.mkdir();
		} else {
			if (ACC_FILE.equals(fileType)) {
				File[] accFiles = dir.listFiles();
				if (accFiles.length > 0) {
					for (File accFile : accFiles) {
						if (accFile.isFile()) {
							if (accFile.getName().endsWith(baiduFileSuffix)) {
								boolean removeFileRes = ZipUtil.deleteFile(accFile.getAbsolutePath());
								logger.info("百度账务文件清理:" + accFile.getAbsolutePath() + "结果[" + removeFileRes + "]");
							}
						}
					}
				}
			}
		}
		// 文件名称
		String fileName = "";
		// 下载路径
		String baiduDownLoadPath = "";
		// 机构标识
		String scrtFlag = "";
		// 解密文件名称
		String baiduJmFileName = "";
		// 是否需要解压缩
		boolean isUnTarGZip = false;
		if (ACC_FILE.equals(fileType)) {
			// 文件类型：账务文件
			fileName = baiduAccFileName.replace("curDate", curDate);
			// 下载路径
			baiduDownLoadPath = baiduAccFileDownPath;
			// 解密文件名称
			baiduJmFileName = baiduAccFileSuffix.replace("curDate", curDate);
		} else if (ACC_LEDGER.equals(fileType)) {
			// 文件类型：并账文件
			fileName = baiduAccLedgerFileName.replace("curDate", curDate);
			// 下载路径
			baiduDownLoadPath = baiduAccLedgerFileDownPath;
			// 解密文件名称
			baiduJmFileName = baiduLedgerFileName + baiduFileSuffix;
		} else if (AGREEMENT.equals(fileType)) {
			filePath = imageFileDownPath + prdCode;
			// 文件类型：合同文件
			fileName = baiduAgreementFileName.replace("curDate", curDate);
			// 下载路径
			baiduDownLoadPath = baiduAgreementFileDownPath;
			// 解密文件名称
			baiduJmFileName = baiduImageFileSuffix;
		} else if (TRANS_FER_MONEY.equals(fileType)) {
			// 文件类型：资金划拨扩展文件
			fileName = baiduTransFerMoneyFileName.replace("curDate", curDate);
			// 下载路径
			baiduDownLoadPath = baiduTransFerMoneyFileDownPath;
			if (TYPE_LE.equals(type)) {
				if (PrdInfoEnum.MYD.getPrdId().equals(prdCode)) {
					// 满易贷试单业务
					fileName = fileName.replace("institutionCode", institutionCode0170);
				} else if (PrdInfoEnum.ZXD.getPrdId().equals(prdCode)) {
					// 尊享贷试单业务
					fileName = fileName.replace("institutionCode", institutionCode0171);
				}
			} else if (TYPE_LF.equals(type)) {
				if (PrdInfoEnum.MYD.getPrdId().equals(prdCode)) {
					// 满易贷试单业务
					fileName = fileName.replace("institutionCode", institutionCode0050);
				} else if (PrdInfoEnum.ZXD.getPrdId().equals(prdCode)) {
					// 尊享贷正式业务
					fileName = fileName.replace("institutionCode", institutionCode0051);
				}
			}
			// 解密文件名称
			baiduJmFileName = fileName + baiduFileSuffix;
		}

		if (TYPE_LE.equals(type)) {
			if (PrdInfoEnum.MYD.getPrdId().equals(prdCode)) {
				// 满易贷试单业务
				scrtFlag = scrtFlag0170;
			} else if (PrdInfoEnum.ZXD.getPrdId().equals(prdCode)) {
				// 尊享贷试单业务
				scrtFlag = scrtFlag0171;
			}
		} else if (TYPE_LF.equals(type)) {
			if (PrdInfoEnum.MYD.getPrdId().equals(prdCode)) {
				// 满易贷试单业务
				scrtFlag = scrtFlag0050;
			} else if (PrdInfoEnum.ZXD.getPrdId().equals(prdCode)) {
				// 尊享贷正式业务
				scrtFlag = scrtFlag0051;
			}
		}

		try {
			result = downFile(filePath, fileName, baiduDownLoadPath, baiduJmFileName, scrtFlag, isUnTarGZip, fileType, prdCode, type,
					curDate);
		} catch (Exception e) {
			String tableName = "bd_acc_loan";
			String msg = "百度账务文件下载出现异常，异常信息：" + e.getMessage();
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), msg, msg);
			logger.error(msg);
			e.printStackTrace();
			logger.error(msg);
		}
		return result;
	}

	/**
	 * 
	 * 从百度服务器下载百度账务文件下载 <br>
	 * 0.1:ludayong:2019年7月15日 上午10:48:33:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年7月15日 上午10:48:33
	 * @date 2019年7月15日 上午10:48:33
	 * @version 0.1
	 */
	public boolean downFile(String filePath, String fileName, String baiduDownLoadPath, String baiduJmFileName, String scrtFlag,
			boolean isUnTarGZip, String fileType, String prdCode, String type, String curDate) {
		// String tarFileName,
		boolean result = true;
		boolean downFileflag = false;
		boolean downMd5flag = false;
		try {
			// 合同文件下载，根据跑批时间和放款状态查询用信信息，判断当天是否有合同文件
			if (AGREEMENT.equals(fileType)) {
				// 网贷申请信息
				NlsApplyInfoVO inNlsApplyInfoVO = new NlsApplyInfoVO();
				// 最后更新时间
				inNlsApplyInfoVO.setLastModifyTime(DateUtility.format8To10(curDate));
				// 放款状态
				inNlsApplyInfoVO.setDnSts(MsLoanConstant.DN_STS_1);
				// 产品编号
				inNlsApplyInfoVO.setPrdCode(prdCode);
				// 根据跑批时间和放款状态查询用信信息，判断当天是否有合同文件
				List<NlsApplyInfoVO> nlsList = nlsApplyInfoService.queryListByConditions(inNlsApplyInfoVO);
				// 根据跑批时间和放款状态查询用信信息数量
				int nlsNum = 0;
				if (Objects.nonNull(nlsList) && !nlsList.isEmpty()) {
					nlsNum = nlsList.size();
				}
				logger.info("根据跑批时间和放款状态查询用信信息，数量：" + nlsNum);
				if (nlsNum == 0) {
					// 如果查询用信信息数量为0，不下载合同文件
					return true;
				}
			}
			// 文件名称(无后缀)
			String localFileMd5 = filePath + File.separator + fileName + md5;
			// 具体到文件名
			String remoteFileMd5 = baiduDownLoadPath + fileName + md5;
			// 具体到文件名
			String localFileTar = filePath + File.separator + fileName + tarGz;
			// 具体到文件名
			String remoteFileTar = baiduDownLoadPath + fileName + tarGz;
			// 解密输出目录
			String baiduJmPath = filePath + File.separator + baiduJm;
			// 合同文件单独处理
			if (AGREEMENT.equals(fileType)) {
				baiduJmPath = filePath + File.separator + fileName;
			}
			// 解压输出目录
			String baiduJyPath = filePath + File.separator;

			logger.info("下载百度账务文件开始...");
			// 判断文件是否存在，存在则删除后再下载
			String[] filePaths = { localFileMd5, localFileTar, filePath + File.separator + baiduJmFileName,
					filePath + File.separator + "key" };
			for (int i = 0; i < filePaths.length; i++) {
				String fPath = filePaths[i];
				File file = new File(fPath);
				logger.info("百度账务文件，目标路径：" + fPath);
				if (file.exists()) {
					boolean removeFileRes = file.delete();
					logger.info("清理存在的百度账务文件，目标路径：" + fPath + "，结果[" + removeFileRes + "]");
				}
			}
			// 百度账务文件下载
			downFileflag = BaiduFileCyptUtil.baiduDownFile(remoteFileTar, localFileTar, scrtFlag);
			if (downFileflag) {
				downMd5flag = BaiduFileCyptUtil.baiduDownFile(remoteFileMd5, localFileMd5, scrtFlag);
			}
			if (downFileflag && downMd5flag) {
				// 创建目录
				String[] urls = { baiduJmPath, baiduJyPath };
				for (String url : urls) {
					logger.info("百度账务文件，目标路径：" + url);
					File dir = new File(url);
					if (!dir.exists()) {
						dir.mkdir();
					}
				}
				logger.info("下载百度账务文件结束！百度账务文件开始解密...");
				try {
					// 百度账务文件解密
					BaiduFileCyptUtil.decryptFile(new File(localFileTar), new File(localFileMd5), baiduJmPath, baiduJmFileName,
							getPrivateKeyLocal, getPublicKeyPartner);
				} catch (Exception e) {
					result = false;
					String tableName = "bd_acc_loan";
					// 解密文件失败，则告警
					String msg = "百度账务文件解密出现异常，异常信息：" + e.getMessage();
					// 记录异常信息
					this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), msg, msg);
					e.printStackTrace();
					logger.error(msg);
					return result;
				}
				if (isUnTarGZip && result) {
					logger.info("百度账务文件解密结束！百度账务文件开始解压...");
					try {
						// 百度账务文件解压
						Security.doUnTarGZip(baiduJmPath, baiduJyPath, baiduJmFileName);
					} catch (Exception e) {
						result = false;
						String tableName = "bd_acc_loan";
						// 解密文件失败，则告警
						String msg = "百度账务文件解压出现异常，异常信息：" + e.getMessage();
						// 记录异常信息
						this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), msg, msg);
						e.printStackTrace();
						logger.error(msg);
						return result;
					}
					logger.info("百度账务文件解压结束！");
				}
			}
			// 判断文件存在，存在则删除
			String[] rmFilePaths = { filePath + File.separator + baiduJmFileName, filePath + File.separator + "key", baiduJmPath };
			if (AGREEMENT.equals(fileType)) {
				// 百度影像文件移动
				result = moveImageFile(filePath, prdCode, type);
			} else {
				for (int i = 0; i < rmFilePaths.length; i++) {
					String fPath = rmFilePaths[i];
					File file = new File(fPath);
					logger.info("百度账务文件，目标路径：" + fPath);
					if (file.exists()) {
						if (file.isDirectory()) {
							if (isUnTarGZip && result) {
								ZipUtil.deleteDirectory(fPath);
							} else {
								try {
									File[] desFiles = file.listFiles();
									if (desFiles.length > 0) {
										for (File desFile : desFiles) {
											boolean moveFileRes = ZipUtil.moveFile(desFile.getAbsolutePath(), filePath, desFile.getName(),
													true);
											logger.debug("百度账务文件移动，源路径：" + desFile.getAbsolutePath() + "，目标路径：" + filePath + "，结果["
													+ moveFileRes + "]");
										}
									}
								} catch (Exception e) {
									result = false;
									String tableName = "bd_acc_loan";
									String msg = "移动文件出错：：" + file.getName() + e.getMessage();
									// 记录异常信息
									this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), msg, msg);
									logger.error(msg);
									e.printStackTrace();
									break;
								} finally {
									file.delete();
								}
							}
						} else {
							boolean removeFileRes = file.delete();
							logger.info("清理存在的百度账务文件，目标路径：" + fPath + "，结果[" + removeFileRes + "]");
						}
					}
				}
			}
			// 备份账务文件
			backUpAccFile(curDate, prdCode, fileType, type);
		} catch (Exception e) {
			result = false;
			String tableName = "bd_acc_loan";
			String msg = "百度账务/合同文件下载出现异常，异常信息：" + e.getMessage();
			// 记录异常信息
			this.addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), msg, msg);
			logger.error(msg);
			e.printStackTrace();
			logger.error(msg);
			return result;
		}
		return result;
	}

	/**
	 * 
	 * 百度影像文件移动 <br>
	 * 0.1:ludayong:2019年7月15日 上午10:48:33:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年7月15日 上午10:48:33
	 * @date 2019年7月15日 上午10:48:33
	 * @version 0.1
	 */
	public boolean moveImageFile(String filePath, String prdCode, String type) {
		boolean result = true;
		try {
			// 影像文件解析地址
			// String analysisPath = imageFilePath + prdCode + File.separator + fileName;
			// 影像文件备份地址
			String backUpPath = imageFileBakPath + prdCode + File.separator + type;
			// 创建目录
			String[] urls = { backUpPath };
			for (String url : urls) {
				logger.info("影像文件路径路径：" + url);
				File dir = new File(url);
				if (!dir.exists()) {
					dir.mkdir();
				}
			}
			File file = new File(filePath);
			logger.info("百度影像文件，目标路径：" + filePath);
			// 文件存在
			if (file.exists()) {
				File[] imageFiles = file.listFiles();
				if (imageFiles.length > 0) {
					for (File imageFile : imageFiles) {
						if (imageFile.isFile()) {
							if (imageFile.getName().endsWith(tarGz) || imageFile.getName().endsWith(md5)) {
								boolean moveFileRes = ZipUtil.moveFile(imageFile.getAbsolutePath(), backUpPath, imageFile.getName(), true);
								logger.info(
										"百度影像文件备份，源路径：" + imageFile.getAbsolutePath() + "，目标路径：" + backUpPath + "，结果[" + moveFileRes + "]");
							} else {
								boolean removeFileRes = imageFile.delete();
								logger.info("清理存在的百度影像文件，目标路径：" + imageFile.getAbsolutePath() + "，结果[" + removeFileRes + "]");
							}
						}
					}
				}
			}
		} catch (Exception e) {
			result = false;
			String errorMsg = "百度影像文件移动出错！";
			String remark = "百度影像文件移动，错误信息：" + e.getMessage();
			String tableName = "bd_acc_ledger";
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		}
		return result;
	}

	/**
	 * 
	 * 校验百度账务文件下載入参信息是否正确 <br>
	 * 0.1:ludayong:2019年7月19日 下午12:26:48:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年7月19日 下午12:26:48
	 * @date 2019年7月19日 下午12:26:48
	 * @version 0.1
	 */
	public boolean checkParamInfo(String curDate, String prdCode, String fileType, String type) {
		logger.info("**************************校验百度账务文件下載入参信息开始**************************");
		boolean result = false;
		try {
			// 百度账务文件下載校验入参信息：批次日期，产品编号，文件类型，业务类型
			if (StringUtil.isNullorBank(curDate) || StringUtil.isNullorBank(prdCode) || StringUtil.isNullorBank(fileType)
					|| StringUtil.isNullorBank(type)) {
				String tableName = "prd_info";
				String errorMsg = "百度账务文件下載校验入参信息不正确，入参信息不能为空，批次日期：" + curDate + "，产品编号：" + prdCode + "，文件类型：" + fileType + "，业务类型：" + type;
				addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
				logger.error(errorMsg);
				return result;
			}

			// 百度账务文件下載校验入参信息：产品编号
			if (!(PrdInfoEnum.ZXD.getPrdId().equals(prdCode) || PrdInfoEnum.MYD.getPrdId().equals(prdCode))) {
				String tableName = "prd_info";
				String errorMsg = "百度账务文件下載校验入参信息不正确，产品信息非满易贷、尊享贷产品，产品编号：" + prdCode;
				addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
				logger.error(errorMsg);
				return result;
			}

			// 百度账务文件下載校验入参信息：文件类型
			if (!(TYPE_LF.equals(type) || TYPE_LE.equals(type))) {
				String tableName = "prd_info";
				String errorMsg = "百度账务文件下載校验入参信息不正确，业务类型：" + type;
				addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
				logger.error(errorMsg);
				return result;
			}

			// 百度账务文件下載校验入参信息：文件类型
			if (!(ACC_FILE.equals(fileType) || ACC_LEDGER.equals(fileType) || AGREEMENT.equals(fileType)
					|| TRANS_FER_MONEY.equals(fileType))) {
				String tableName = "prd_info";
				String errorMsg = "百度账务文件下載校验入参信息不正确，文件类型类型：" + fileType;
				addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, errorMsg);
				logger.error(errorMsg);
				return result;
			}
			result = true;
		} catch (Exception e) {
			result = false;
			String errorMsg = "校验百度账务文件下載入参信息出错！";
			String remark = "校验百度账务文件下載入参信息出错，错误信息：" + e.getMessage();
			String tableName = "bd_acc_ledger";
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		}
		logger.info("**************************校验百度账务文件下載入参信息结束**************************结果[" + result + "]");
		return result;
	}

	/**
	 * 
	 * 百度账务文件备份 <br>
	 * 0.1:ludayong:2019年7月15日 上午10:48:33:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年7月15日 上午10:48:33
	 * @date 2019年7月15日 上午10:48:33
	 * @version 0.1
	 */
	public boolean backUpAccFile(String curDate, String prdCode, String fileType, String type) {
		boolean result = false;
		try {
			// 账务文件路径
			String filePath = accFilePathBaidu + prdCode + File.separator + curDate;
			// 备份账务文件路径
			String backUpFilePath = accFilePathBaidu + prdCode + File.separator + curDate + File.separator + type;
			logger.info("百度账务文件源路径：" + filePath + "，百度账务文件备份路径：" + backUpFilePath);
			// 创建目录
			File dir = new File(backUpFilePath);
			if (!dir.exists()) {
				dir.mkdir();
			}
			// 账务文件路径
			File files = new File(filePath);
			// 同步文件解析路径
			if (files.exists()) {
				File[] accFiles = files.listFiles();
				if (accFiles.length > 0) {
					for (File accFile : accFiles) {
						if (accFile.isFile()) {
							if (accFile.getName().endsWith(tarGz) || accFile.getName().endsWith(md5)) {
								boolean moveFileRes = ZipUtil.moveFile(accFile.getAbsolutePath(), backUpFilePath, accFile.getName());
								logger.debug("百度账务文件备份，源路径：" + accFile.getAbsolutePath() + "，目标路径：" + backUpFilePath + "，结果[" + moveFileRes
										+ "]");
							}
						}
					}
					result = true;
				}
			}
		} catch (Exception e) {
			result = false;
			String errorMsg = "百度账务文件备份出错！";
			String remark = "百度账务文件备份，错误信息：" + e.getMessage();
			String tableName = "bd_acc_ledger";
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		}
		return result;
	}

	/**
	 * 
	 * 百度账务文件清理 <br>
	 * 0.1:ludayong:2019年7月15日 上午10:48:33:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年7月15日 上午10:48:33
	 * @date 2019年7月15日 上午10:48:33
	 * @version 0.1
	 */
	public boolean clearAccFile(String curDate, String prdCode, String fileType, String type) {
		boolean result = false;
		try {
			// 清理日期
			String clearDate = DateUtility.format10To8(DateUtility.ADD_DAY(DateUtility.format8To10(curDate), -7));
			// 账务文件路径
			String filePath = accFilePathBaidu + prdCode + File.separator + clearDate;
			logger.info("百度账务文件清理路径：" + filePath);
			// 账务文件路径
			File files = new File(filePath);
			// 同步文件解析路径
			if (files.exists()) {
				File[] accFiles = files.listFiles();
				if (accFiles.length > 0) {
					for (File accFile : accFiles) {
						if (accFile.isFile()) {
							if (accFile.getName().endsWith(baiduFileSuffix)) {
								boolean removeFileRes = ZipUtil.deleteFile(accFile.getAbsolutePath());
								logger.info("百度账务文件清理:" + accFile.getAbsolutePath() + "结果[" + removeFileRes + "]");
							}
						}
					}
				}
			}
			result = true;
		} catch (Exception e) {
			result = false;
			String errorMsg = "百度账务文件清理出错！";
			String remark = "百度账务文件清理，错误信息：" + e.getMessage();
			String tableName = "bd_acc_ledger";
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		}
		return result;
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:ludayong:2019年5月7日 上午11:31:23:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年5月7日 上午11:31:23
	 * @date 2019年5月7日 上午11:31:23
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}
}
